{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 训练模型"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import pandas as pd\n",
    "\n",
    "from sklearn.linear_model import LogisticRegression\n",
    "from sklearn.model_selection import cross_val_score"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>pregnants</th>\n",
       "      <th>Plasma_glucose_concentration</th>\n",
       "      <th>blood_pressure</th>\n",
       "      <th>Triceps_skin_fold_thickness</th>\n",
       "      <th>serum_insulin</th>\n",
       "      <th>BMI</th>\n",
       "      <th>Diabetes_pedigree_function</th>\n",
       "      <th>Age</th>\n",
       "      <th>serum_insulin_Missing</th>\n",
       "      <th>Target</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0.639947</td>\n",
       "      <td>0.866045</td>\n",
       "      <td>-0.031990</td>\n",
       "      <td>0.670643</td>\n",
       "      <td>-0.181541</td>\n",
       "      <td>0.166619</td>\n",
       "      <td>0.468492</td>\n",
       "      <td>1.425995</td>\n",
       "      <td>1.026390</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>-0.844885</td>\n",
       "      <td>-1.205066</td>\n",
       "      <td>-0.528319</td>\n",
       "      <td>-0.012301</td>\n",
       "      <td>-0.181541</td>\n",
       "      <td>-0.852200</td>\n",
       "      <td>-0.365061</td>\n",
       "      <td>-0.190672</td>\n",
       "      <td>1.026390</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>1.233880</td>\n",
       "      <td>2.016662</td>\n",
       "      <td>-0.693761</td>\n",
       "      <td>-0.012301</td>\n",
       "      <td>-0.181541</td>\n",
       "      <td>-1.332500</td>\n",
       "      <td>0.604397</td>\n",
       "      <td>-0.105584</td>\n",
       "      <td>1.026390</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>-0.844885</td>\n",
       "      <td>-1.073567</td>\n",
       "      <td>-0.528319</td>\n",
       "      <td>-0.695245</td>\n",
       "      <td>-0.540642</td>\n",
       "      <td>-0.633881</td>\n",
       "      <td>-0.920763</td>\n",
       "      <td>-1.041549</td>\n",
       "      <td>-0.974289</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>-1.141852</td>\n",
       "      <td>0.504422</td>\n",
       "      <td>-2.679076</td>\n",
       "      <td>0.670643</td>\n",
       "      <td>0.316566</td>\n",
       "      <td>1.549303</td>\n",
       "      <td>5.484909</td>\n",
       "      <td>-0.020496</td>\n",
       "      <td>-0.974289</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   pregnants  Plasma_glucose_concentration  blood_pressure  \\\n",
       "0   0.639947                      0.866045       -0.031990   \n",
       "1  -0.844885                     -1.205066       -0.528319   \n",
       "2   1.233880                      2.016662       -0.693761   \n",
       "3  -0.844885                     -1.073567       -0.528319   \n",
       "4  -1.141852                      0.504422       -2.679076   \n",
       "\n",
       "   Triceps_skin_fold_thickness  serum_insulin       BMI  \\\n",
       "0                     0.670643      -0.181541  0.166619   \n",
       "1                    -0.012301      -0.181541 -0.852200   \n",
       "2                    -0.012301      -0.181541 -1.332500   \n",
       "3                    -0.695245      -0.540642 -0.633881   \n",
       "4                     0.670643       0.316566  1.549303   \n",
       "\n",
       "   Diabetes_pedigree_function       Age  serum_insulin_Missing  Target  \n",
       "0                    0.468492  1.425995               1.026390       1  \n",
       "1                   -0.365061 -0.190672               1.026390       0  \n",
       "2                    0.604397 -0.105584               1.026390       1  \n",
       "3                   -0.920763 -1.041549              -0.974289       0  \n",
       "4                    5.484909 -0.020496              -0.974289       1  "
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data=pd.read_csv('FE_pima-indians-diabetes.csv')\n",
    "data.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 数据分离"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "y_train=data['Target']\n",
    "X_train=data.drop(['Target'],axis=1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>pregnants</th>\n",
       "      <th>Plasma_glucose_concentration</th>\n",
       "      <th>blood_pressure</th>\n",
       "      <th>Triceps_skin_fold_thickness</th>\n",
       "      <th>serum_insulin</th>\n",
       "      <th>BMI</th>\n",
       "      <th>Diabetes_pedigree_function</th>\n",
       "      <th>Age</th>\n",
       "      <th>serum_insulin_Missing</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0.639947</td>\n",
       "      <td>0.866045</td>\n",
       "      <td>-0.031990</td>\n",
       "      <td>0.670643</td>\n",
       "      <td>-0.181541</td>\n",
       "      <td>0.166619</td>\n",
       "      <td>0.468492</td>\n",
       "      <td>1.425995</td>\n",
       "      <td>1.026390</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>-0.844885</td>\n",
       "      <td>-1.205066</td>\n",
       "      <td>-0.528319</td>\n",
       "      <td>-0.012301</td>\n",
       "      <td>-0.181541</td>\n",
       "      <td>-0.852200</td>\n",
       "      <td>-0.365061</td>\n",
       "      <td>-0.190672</td>\n",
       "      <td>1.026390</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>1.233880</td>\n",
       "      <td>2.016662</td>\n",
       "      <td>-0.693761</td>\n",
       "      <td>-0.012301</td>\n",
       "      <td>-0.181541</td>\n",
       "      <td>-1.332500</td>\n",
       "      <td>0.604397</td>\n",
       "      <td>-0.105584</td>\n",
       "      <td>1.026390</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>-0.844885</td>\n",
       "      <td>-1.073567</td>\n",
       "      <td>-0.528319</td>\n",
       "      <td>-0.695245</td>\n",
       "      <td>-0.540642</td>\n",
       "      <td>-0.633881</td>\n",
       "      <td>-0.920763</td>\n",
       "      <td>-1.041549</td>\n",
       "      <td>-0.974289</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>-1.141852</td>\n",
       "      <td>0.504422</td>\n",
       "      <td>-2.679076</td>\n",
       "      <td>0.670643</td>\n",
       "      <td>0.316566</td>\n",
       "      <td>1.549303</td>\n",
       "      <td>5.484909</td>\n",
       "      <td>-0.020496</td>\n",
       "      <td>-0.974289</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   pregnants  Plasma_glucose_concentration  blood_pressure  \\\n",
       "0   0.639947                      0.866045       -0.031990   \n",
       "1  -0.844885                     -1.205066       -0.528319   \n",
       "2   1.233880                      2.016662       -0.693761   \n",
       "3  -0.844885                     -1.073567       -0.528319   \n",
       "4  -1.141852                      0.504422       -2.679076   \n",
       "\n",
       "   Triceps_skin_fold_thickness  serum_insulin       BMI  \\\n",
       "0                     0.670643      -0.181541  0.166619   \n",
       "1                    -0.012301      -0.181541 -0.852200   \n",
       "2                    -0.012301      -0.181541 -1.332500   \n",
       "3                    -0.695245      -0.540642 -0.633881   \n",
       "4                     0.670643       0.316566  1.549303   \n",
       "\n",
       "   Diabetes_pedigree_function       Age  serum_insulin_Missing  \n",
       "0                    0.468492  1.425995               1.026390  \n",
       "1                   -0.365061 -0.190672               1.026390  \n",
       "2                    0.604397 -0.105584               1.026390  \n",
       "3                   -0.920763 -1.041549              -0.974289  \n",
       "4                    5.484909 -0.020496              -0.974289  "
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X_train.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 包含serum_insulin_Missing特征"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 1. 分别用neg_log_loss和accuracy用默认参数训练lr"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "lr_1=LogisticRegression()\n",
    "lr_2=LogisticRegression()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "五折交叉验证+log似然损失"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "logloss of each fold is:  [0.48754913 0.52902957 0.45346545 0.42101802 0.47820343]\n",
      "cv logloss is: 0.4738531197950989\n"
     ]
    }
   ],
   "source": [
    "from sklearn.model_selection import cross_val_score\n",
    "loss_log = cross_val_score(lr_1, X_train, y_train, cv=5, scoring='neg_log_loss')\n",
    "\n",
    "print( 'logloss of each fold is: ',-loss_log)\n",
    "print('cv logloss is:', -loss_log.mean())"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "五折交叉验证+正确率"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "logloss of each fold is:  [0.77272727 0.72077922 0.76623377 0.79738562 0.77124183]\n",
      "cv logloss is: 0.7656735421441304\n"
     ]
    }
   ],
   "source": [
    "loss_acc = cross_val_score(lr_2, X_train, y_train, cv=5, scoring='accuracy')\n",
    "\n",
    "print( 'logloss of each fold is: ',loss_acc)\n",
    "print('cv logloss is:', loss_acc.mean())"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 2.1 超参数调优(GridSearchCV)+logloss"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.model_selection import StratifiedKFold\n",
    "fold = StratifiedKFold(n_splits=5, shuffle=True, random_state=777)   #数据分割"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "GridSearchCV(cv=StratifiedKFold(n_splits=5, random_state=777, shuffle=True),\n",
       "       error_score='raise',\n",
       "       estimator=LogisticRegression(C=1.0, class_weight=None, dual=False, fit_intercept=True,\n",
       "          intercept_scaling=1, max_iter=100, multi_class='ovr', n_jobs=1,\n",
       "          penalty='l2', random_state=None, solver='liblinear', tol=0.0001,\n",
       "          verbose=0, warm_start=False),\n",
       "       fit_params=None, iid=True, n_jobs=1,\n",
       "       param_grid={'penalty': ['l1', 'l2'], 'C': [0.001, 0.01, 0.1, 1, 10, 100, 1000]},\n",
       "       pre_dispatch='2*n_jobs', refit=True, return_train_score='warn',\n",
       "       scoring='neg_log_loss', verbose=0)"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.model_selection import GridSearchCV\n",
    "\n",
    "#需要调优的参数\n",
    "# 请尝试将L1正则和L2正则分开，并配合合适的优化求解算法（slover）\n",
    "#tuned_parameters = {'penalty':['l1','l2'],\n",
    "#                   'C': [0.001, 0.01, 0.1, 1, 10, 100, 1000]\n",
    "#                   }\n",
    "penaltys = ['l1','l2']\n",
    "Cs = [0.001, 0.01, 0.1, 1, 10, 100, 1000]\n",
    "tuned_parameters = dict(penalty = penaltys, C = Cs)\n",
    "\n",
    "lr_penalty= LogisticRegression(solver='liblinear')\n",
    "grid= GridSearchCV(lr_penalty, tuned_parameters,cv=fold, scoring='neg_log_loss')\n",
    "grid.fit(X_train,y_train)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.47356282311192593\n",
      "{'C': 1, 'penalty': 'l1'}\n"
     ]
    }
   ],
   "source": [
    "print(-grid.best_score_)\n",
    "print(grid.best_params_)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "D:\\software\\install\\anaconda\\lib\\site-packages\\sklearn\\utils\\deprecation.py:122: FutureWarning: You are accessing a training score ('mean_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "D:\\software\\install\\anaconda\\lib\\site-packages\\sklearn\\utils\\deprecation.py:122: FutureWarning: You are accessing a training score ('std_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "<matplotlib.figure.Figure at 0x200e47cd3c8>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "# plot CV误差曲线\n",
    "test_means = grid.cv_results_[ 'mean_test_score' ]\n",
    "test_stds = grid.cv_results_[ 'std_test_score' ]\n",
    "train_means = grid.cv_results_[ 'mean_train_score' ]\n",
    "train_stds = grid.cv_results_[ 'std_train_score' ]\n",
    "\n",
    "# plot results\n",
    "n_Cs = len(Cs)\n",
    "number_penaltys = len(penaltys)\n",
    "test_scores = np.array(test_means).reshape(n_Cs,number_penaltys)\n",
    "train_scores = np.array(train_means).reshape(n_Cs,number_penaltys)\n",
    "test_stds = np.array(test_stds).reshape(n_Cs,number_penaltys)\n",
    "train_stds = np.array(train_stds).reshape(n_Cs,number_penaltys)\n",
    "\n",
    "x_axis = np.log10(Cs)\n",
    "for i, value in enumerate(penaltys):\n",
    "    #pyplot.plot(log(Cs), test_scores[i], label= 'penalty:'   + str(value))\n",
    "    plt.errorbar(x_axis, -test_scores[:,i], yerr=test_stds[:,i] ,label = penaltys[i] +' Test')\n",
    "    plt.errorbar(x_axis, -train_scores[:,i], yerr=train_stds[:,i] ,label = penaltys[i] +' Train')\n",
    "    \n",
    "plt.legend()\n",
    "plt.xlabel( 'log(C)' )                                                                                                      \n",
    "plt.ylabel( 'logloss' )\n",
    "plt.savefig('LogisticGridSearchCV_C.png' )\n",
    "\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [],
   "source": [
    "lr_logloss_grid_best = grid.best_estimator_"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 2.2 超参数调优（GridSearchCV）+accuracy"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "GridSearchCV(cv=StratifiedKFold(n_splits=5, random_state=777, shuffle=True),\n",
       "       error_score='raise',\n",
       "       estimator=LogisticRegression(C=1.0, class_weight=None, dual=False, fit_intercept=True,\n",
       "          intercept_scaling=1, max_iter=100, multi_class='ovr', n_jobs=1,\n",
       "          penalty='l2', random_state=None, solver='liblinear', tol=0.0001,\n",
       "          verbose=0, warm_start=False),\n",
       "       fit_params=None, iid=True, n_jobs=1,\n",
       "       param_grid={'penalty': ['l1', 'l2'], 'C': [0.001, 0.01, 0.1, 1, 10, 100, 1000]},\n",
       "       pre_dispatch='2*n_jobs', refit=True, return_train_score='warn',\n",
       "       scoring='accuracy', verbose=0)"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "penaltys = ['l1','l2']\n",
    "Cs = [0.001, 0.01, 0.1, 1, 10, 100, 1000]\n",
    "tuned_parameters = dict(penalty = penaltys, C = Cs)\n",
    "\n",
    "lr_penalty= LogisticRegression(solver='liblinear')\n",
    "grid_acc= GridSearchCV(lr_penalty, tuned_parameters,cv=fold, scoring='accuracy')\n",
    "grid_acc.fit(X_train,y_train)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.7682291666666666\n",
      "{'C': 0.01, 'penalty': 'l2'}\n"
     ]
    }
   ],
   "source": [
    "print(grid_acc.best_score_)\n",
    "print(grid_acc.best_params_)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "与以logloss为标准时的结果相差较大，评价指标的选择很重要"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "D:\\software\\install\\anaconda\\lib\\site-packages\\sklearn\\utils\\deprecation.py:122: FutureWarning: You are accessing a training score ('mean_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "D:\\software\\install\\anaconda\\lib\\site-packages\\sklearn\\utils\\deprecation.py:122: FutureWarning: You are accessing a training score ('std_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x200e534bf28>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "test_means = grid_acc.cv_results_[ 'mean_test_score' ]\n",
    "test_stds = grid_acc.cv_results_[ 'std_test_score' ]\n",
    "train_means = grid_acc.cv_results_[ 'mean_train_score' ]\n",
    "train_stds = grid_acc.cv_results_[ 'std_train_score' ]\n",
    "\n",
    "# plot results\n",
    "n_Cs = len(Cs)\n",
    "number_penaltys = len(penaltys)\n",
    "test_scores = np.array(test_means).reshape(n_Cs,number_penaltys)\n",
    "train_scores = np.array(train_means).reshape(n_Cs,number_penaltys)\n",
    "test_stds = np.array(test_stds).reshape(n_Cs,number_penaltys)\n",
    "train_stds = np.array(train_stds).reshape(n_Cs,number_penaltys)\n",
    "\n",
    "x_axis = np.log10(Cs)\n",
    "for i, value in enumerate(penaltys):\n",
    "    #pyplot.plot(log(Cs), test_scores[i], label= 'penalty:'   + str(value))\n",
    "    plt.errorbar(x_axis, -test_scores[:,i], yerr=test_stds[:,i] ,label = penaltys[i] +' Test')\n",
    "    plt.errorbar(x_axis, -train_scores[:,i], yerr=train_stds[:,i] ,label = penaltys[i] +' Train')\n",
    "    \n",
    "plt.legend()\n",
    "plt.xlabel( 'log(C)' )                                                                                                      \n",
    "plt.ylabel( 'logloss' )\n",
    "plt.savefig('LogisticGridSearchCV_C.png' )\n",
    "\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 2.3 超参数调优(LogisticRegressionCV)+logloss"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "LogisticRegressionCV(Cs=[0.001, 0.01, 0.1, 1, 10, 100, 1000],\n",
       "           class_weight=None,\n",
       "           cv=StratifiedKFold(n_splits=5, random_state=777, shuffle=True),\n",
       "           dual=False, fit_intercept=True, intercept_scaling=1.0,\n",
       "           max_iter=100, multi_class='ovr', n_jobs=4, penalty='l1',\n",
       "           random_state=None, refit=True, scoring='neg_log_loss',\n",
       "           solver='liblinear', tol=0.0001, verbose=0)"
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.linear_model import LogisticRegressionCV\n",
    "\n",
    "Cs = [1e-3, 1e-2, 1e-1, 1, 10, 100, 1000]\n",
    "#nCs = 9  #Cs values are chosen in a logarithmic scale between 1e-4 and 1e4.\n",
    "\n",
    "# 大量样本（6W+）、高维度（93），L1正则 --> 可选用saga优化求解器(0.19版本新功能)\n",
    "#LogisticRegressionCV比GridSearchCV快\n",
    "lrcv_L1 = LogisticRegressionCV(Cs=Cs, cv = fold, scoring='neg_log_loss', penalty='l1', solver='liblinear', multi_class='ovr',n_jobs=4)\n",
    "lrcv_L1.fit(X_train, y_train)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [],
   "source": [
    "logloss_mean=-np.mean(lrcv_L1.scores_[1],axis=0)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[<matplotlib.lines.Line2D at 0x200e5291d30>]"
      ]
     },
     "execution_count": 18,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x200e5531438>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "n_Cs=len(Cs)\n",
    "plt.plot(np.log10(Cs), logloss_mean.reshape(n_Cs,1))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "1 0.4735847727532236\n"
     ]
    }
   ],
   "source": [
    "best_C = np.argmin(logloss_mean)\n",
    "best_score = np.min(logloss_mean)\n",
    "print (Cs[best_C], best_score)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "LogisticRegressionCV的score比GridSearchCV相差很小，且最优参数一致！"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 去掉serum_insulin_Missing特征"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [],
   "source": [
    "X_train=X_train.drop(['serum_insulin_Missing'],axis=1)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 3.1 分别用neg_log_loss和accuracy用默认参数训练lr"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [],
   "source": [
    "lr_1_noMissing=LogisticRegression()\n",
    "lr_2_noMissing=LogisticRegression()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "logloss of each fold is:  [0.48797856 0.53011593 0.4562292  0.422546   0.48392885]\n",
      "cv logloss is: 0.47615970944434044\n"
     ]
    }
   ],
   "source": [
    "loss_log = cross_val_score(lr_1_noMissing, X_train, y_train, cv=5, scoring='neg_log_loss')\n",
    "\n",
    "print( 'logloss of each fold is: ',-loss_log)\n",
    "print('cv logloss is:', -loss_log.mean())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "logloss of each fold is:  [0.75974026 0.74025974 0.78571429 0.79738562 0.77124183]\n",
      "cv logloss is: 0.7708683473389355\n"
     ]
    }
   ],
   "source": [
    "loss_acc = cross_val_score(lr_2_noMissing, X_train, y_train, cv=5, scoring='accuracy')\n",
    "\n",
    "print( 'logloss of each fold is: ',loss_acc)\n",
    "print('cv logloss is:', loss_acc.mean())"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 3.2 超参数调优(GridSearchCV)+logloss"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "GridSearchCV(cv=StratifiedKFold(n_splits=5, random_state=777, shuffle=True),\n",
       "       error_score='raise',\n",
       "       estimator=LogisticRegression(C=1.0, class_weight=None, dual=False, fit_intercept=True,\n",
       "          intercept_scaling=1, max_iter=100, multi_class='ovr', n_jobs=1,\n",
       "          penalty='l2', random_state=None, solver='liblinear', tol=0.0001,\n",
       "          verbose=0, warm_start=False),\n",
       "       fit_params=None, iid=True, n_jobs=1,\n",
       "       param_grid={'penalty': ['l1', 'l2'], 'C': [0.001, 0.01, 0.1, 1, 10, 100, 1000]},\n",
       "       pre_dispatch='2*n_jobs', refit=True, return_train_score='warn',\n",
       "       scoring='neg_log_loss', verbose=0)"
      ]
     },
     "execution_count": 24,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "penaltys = ['l1','l2']\n",
    "Cs = [0.001, 0.01, 0.1, 1, 10, 100, 1000]\n",
    "tuned_parameters = dict(penalty = penaltys, C = Cs)\n",
    "\n",
    "lr_penalty= LogisticRegression(solver='liblinear')\n",
    "grid_noMissing= GridSearchCV(lr_penalty, tuned_parameters,cv=fold, scoring='neg_log_loss')\n",
    "grid_noMissing.fit(X_train,y_train)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "-0.47481933685522026\n",
      "{'C': 1, 'penalty': 'l1'}\n"
     ]
    }
   ],
   "source": [
    "print(grid_noMissing.best_score_)\n",
    "print(grid_noMissing.best_params_)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "D:\\software\\install\\anaconda\\lib\\site-packages\\sklearn\\utils\\deprecation.py:122: FutureWarning: You are accessing a training score ('mean_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "D:\\software\\install\\anaconda\\lib\\site-packages\\sklearn\\utils\\deprecation.py:122: FutureWarning: You are accessing a training score ('std_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x200e47985c0>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "test_means = grid_noMissing.cv_results_[ 'mean_test_score' ]\n",
    "test_stds = grid_noMissing.cv_results_[ 'std_test_score' ]\n",
    "train_means = grid_noMissing.cv_results_[ 'mean_train_score' ]\n",
    "train_stds = grid_noMissing.cv_results_[ 'std_train_score' ]\n",
    "\n",
    "# plot results\n",
    "n_Cs = len(Cs)\n",
    "number_penaltys = len(penaltys)\n",
    "test_scores = np.array(test_means).reshape(n_Cs,number_penaltys)\n",
    "train_scores = np.array(train_means).reshape(n_Cs,number_penaltys)\n",
    "test_stds = np.array(test_stds).reshape(n_Cs,number_penaltys)\n",
    "train_stds = np.array(train_stds).reshape(n_Cs,number_penaltys)\n",
    "\n",
    "x_axis = np.log10(Cs)\n",
    "for i, value in enumerate(penaltys):\n",
    "    #pyplot.plot(log(Cs), test_scores[i], label= 'penalty:'   + str(value))\n",
    "    plt.errorbar(x_axis, -test_scores[:,i], yerr=test_stds[:,i] ,label = penaltys[i] +' Test')\n",
    "    plt.errorbar(x_axis, -train_scores[:,i], yerr=train_stds[:,i] ,label = penaltys[i] +' Train')\n",
    "    \n",
    "plt.legend()\n",
    "plt.xlabel( 'log(C)' )                                                                                                      \n",
    "plt.ylabel( 'logloss' )\n",
    "plt.savefig('LogisticGridSearchCV_C.png' )\n",
    "\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "serum_insulin_Missing字段对结果影响不大"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 3.3 GridSearchCV+accuracy"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "GridSearchCV(cv=StratifiedKFold(n_splits=5, random_state=777, shuffle=True),\n",
       "       error_score='raise',\n",
       "       estimator=LogisticRegression(C=1.0, class_weight=None, dual=False, fit_intercept=True,\n",
       "          intercept_scaling=1, max_iter=100, multi_class='ovr', n_jobs=1,\n",
       "          penalty='l2', random_state=None, solver='liblinear', tol=0.0001,\n",
       "          verbose=0, warm_start=False),\n",
       "       fit_params=None, iid=True, n_jobs=1,\n",
       "       param_grid={'penalty': ['l1', 'l2'], 'C': [0.001, 0.01, 0.1, 1, 10, 100, 1000]},\n",
       "       pre_dispatch='2*n_jobs', refit=True, return_train_score='warn',\n",
       "       scoring='accuracy', verbose=0)"
      ]
     },
     "execution_count": 27,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "penaltys = ['l1','l2']\n",
    "Cs = [0.001, 0.01, 0.1, 1, 10, 100, 1000]\n",
    "tuned_parameters = dict(penalty = penaltys, C = Cs)\n",
    "\n",
    "lr_penalty= LogisticRegression(solver='liblinear')\n",
    "grid_acc_noMissing= GridSearchCV(lr_penalty, tuned_parameters,cv=fold, scoring='accuracy')\n",
    "grid_acc_noMissing.fit(X_train,y_train)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.76953125\n",
      "{'C': 0.1, 'penalty': 'l2'}\n"
     ]
    }
   ],
   "source": [
    "print(grid_acc_noMissing.best_score_)\n",
    "print(grid_acc_noMissing.best_params_)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "D:\\software\\install\\anaconda\\lib\\site-packages\\sklearn\\utils\\deprecation.py:122: FutureWarning: You are accessing a training score ('mean_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "D:\\software\\install\\anaconda\\lib\\site-packages\\sklearn\\utils\\deprecation.py:122: FutureWarning: You are accessing a training score ('std_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n"
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAZQAAAEKCAYAAAA1qaOTAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMS4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvNQv5yAAAIABJREFUeJzt3Xd4VGXax/HvPemkQIAAAUJClZYQJDSRooAgrhQLYJfVRXdxba+7urprX8VldVXUFURZVBSwIIiiCCIoCiEgVRQUAQOhd1JIud8/ZhIBA0ySmZyU+3Ndc80pz5n5PQFyc9pzRFUxxhhjysrldABjjDFVgxUUY4wxPmEFxRhjjE9YQTHGGOMTVlCMMcb4hBUUY4wxPmEFxRhjjE9YQTHGGOMTVlCMMcb4RKDTAcpT3bp1NSEhwekYxhhTqaxYsWKvqsacrV21KigJCQmkpaU5HcMYYyoVEdnqTTs75GWMMcYnrKAYY4zxCSsoxhhjfKJanUMxxlRfubm5pKenk52d7XSUCis0NJTGjRsTFBRUqu2toBhjqoX09HQiIyNJSEhARJyOU+GoKvv27SM9PZ2mTZuW6jPskJcxplrIzs6mTp06VkxOQ0SoU6dOmfbgrKAYY6oNKyZnVtafjxUUY4w5jRETvmHEhG+cjlFpWEHxgv2lMsb4QkRERNH0wIEDqVWrFr/73e+KbTtmzBiSk5Np27YtYWFhJCcnk5yczLvvvlui71y5ciWffPJJmXJ7y07KG2OMA/7yl7+QmZnJhAkTil3/4osvArBlyxZ+97vfsWrVqlJ9z8qVK1m3bh0DBw4sdVZv2R6KF27KeJibMh5yOoYxpgrp27cvkZGRpdp206ZNDBgwgE6dOtGrVy82btwIwLRp02jfvj0dOnTgggsuICsri0cffZSpU6eWau+mpGwPxQu1Cg6SJD+xffN6GjVr53QcY0wZPfLher7bcfis7b7LcLfx5pB324ZRPHRp+fx+GD16NJMmTaJ58+YsWbKE2267jXnz5vHII4/wxRdfUL9+fQ4ePEhYWBgPPvgg69at49lnn/V7LttD8cKEuveTSyD7p9+GFhQ4HccYU40dPHiQpUuXcvnll5OcnMyYMWPYsWMHAD169OD6669n0qRJFDjwu8r2ULxwNKQer4Zcy505r5A2ZyIpg291OpIxpgy83ZMo3DOZfkt3f8YpEVWlbt26xZ5TeeWVV1i2bBlz5syhQ4cOrFmzplyz2R6KF6bf0p0//3UsPwSeQ7OV/+Tg3l1ORzLGVFPR0dHExsYyc+ZMAAoKCli9ejUAmzdvplu3bjz22GNER0ezfft2IiMjOXLkSLlks4LipYDAQIKGjidSj7HxzTudjmOMqeR69uzJlVdeyYIFC2jcuDGffvqp19tOmzaNl19+mQ4dOtCuXTvmzJkDwF133UViYiKJiYn069eP9u3bc+GFF7J69Wo6duxoJ+Urkmbtu/LNkmvonvE665d8RLselzgdyRhTiRw9erRo+ssvv/Rqm4SEBNatW3fSsmbNmhVbgGbPnv2bZTExMeX2YEHbQymh5GufYIfUJ2r+PWRnHXM6jjHGj6bf0r1CnT+p6KyglFBYeCT7LhhLnO7g27cedDqOMcZUGFZQSiGx12WkRfWj07bJbP1+pdNxjDGmQnCkoIhIbRH5TEQ2ed6jT9OuiYjME5ENIvKdiCR4louI/FNENnrW3V6e+QGaXvMcWRJK5nu3UZCfX95fb4wxFY5Teyj3AQtUtSWwwDNfnNeBcaraBugC7PYsvxGIA1p71k3zb9zfqlO/MRuT7qVN7nrSZj5X3l9vjDEVjlMFZQgwxTM9BRh6agMRaQsEqupnAKp6VFUzPav/CDyqqgWedbtP3b48pAz9M98FJ9J63b/Zu3ObExGMMf40+RL3y3jFqYJSX1UzADzv9Ypp0wo4KCLvi8i3IjJORAI865oDI0QkTUTmikjLcsp9EnG5iLjiBUI1h61T73AigjGmEinv4etnzpzJuHHjypzbW367D0VE5gMNiln1gJcfEQj0BDoC24DpuA91vQqEANmqmiIilwGvedoWl2M0MBqgSZMmJeiBd5q0Suab+Jvovm0Cqxe+Q4cLrvT5dxhjqh5fDV+fl5dHYGDxv8qHDRvmm7Be8tseiqr2U9X2xbxmAbtEJBbA817cIat04FtV3ayqecAHwLknrHvPMz0TSDpDjomqmqKqKTExMb7q3knOvfphtroaU2/R38g8esgv32GMqVrKMnz9+eefzwMPPECvXr144YUXmDVrFl27dqVjx45cdNFF7N7t/pU6adIk7rzTPbLHtddeyx133MF5551Hs2bNioZu8SWn7pSfDdwAjPW8zyqmzXIgWkRiVHUPcCFQeLvnB57514DewEa/Jz6DkNAaZA54mvi5I1j65t/odutLTsYxxpzN3Ptg59qzt9vpGVzRm/MoDRLh4rFly1UChw8fZvHixQAcOHCAwYMHIyK8/PLLPP300zz11FO/2Wb37t0sWbKEtWvXMnz4cJ/vwThVUMYCM0TkJtyHs64EEJEU4FZVvVlV80XkHmCBiAiwAnjlhO2nishdwFHg5nLvwSnadB1I6rLfkZLxNj+tuZbmSec5HckYU4WNHDmyaHrbtm0MHz6cnTt3kpOTQ6tWrYrdZujQoYgISUlJbN++3eeZHCkoqroP6FvM8jROKA6eK7x+czhLVQ8CFe7Si3OufZZDz39JwezbyW+7lIDTHNc0xjjM2z2Jwj2TUR/5L0sphYeHF02PGTOG+++/n0GDBjF//nzGji2+fyEhIUXTqurzTHanvA/VrB3Dz53/Qcu8TSyf8dvdTWOM8YdDhw7RqFEjVJUpU6acfQM/sYLiY50uvok1oZ1J/OF5dv7yo9NxjDEVVFmGrz/Vww8/zLBhw+jduzf169f3YcqSEX/s9lRUKSkpWh7DOO/4+Xui/9eT78NTSL7nI8RlddsYp23YsIE2bdqUbKMKfMjLX4r7OYnIClVNOdu29pvODxo2bc3qFn+kY+bXrPrsDafjGGNKa9RH1aqYlJUVFD9JGfl3fgpoRqNvHubwwX1OxzHGGL+zguIngUHB5F/yLHX0AN+9eY/TcYwxxu+soPhRq3N7k1b/Crrsmcn3y+c7HccYY/zKCoqftbt2HHukNiFz7yb3eI7TcYwxxm+soPhZRFQ0GT0eo2nBVtLeftTpOMaYEhj1yShGfTLK6RiVhhWUcpDc/xpWhvek4+YJbN+83uk4xhiHFA5fv2rVKrp37067du1ISkpi+vTpv2nri+HrAVauXMknn3zik/xnY2ODlJPGV48nb2J39k8fQ8N7P7d7U4ypxmrUqMHrr79Oy5Yt2bFjB506dWLAgAHUqlWrqI23w9efzcqVK1m3bh0DBw70SfYzsd9q5aReo6asb3sniTnfsmJO8c8/MMZUD61ataJlS/dzARs2bEi9evXYs2eP19tv2rSJAQMG0KlTJ3r16sXGje4B16dNm0b79u3p0KEDF1xwAVlZWTz66KNMnTq1VHs3JWV7KOWo8+X38MPY92m+8gkOnjeMWnWLe/6YMcbfnkp9iu/3f3/WdoVtvDmP0rp2a+7tcm+Js6SmpnL8+HGaN2/u9TajR49m0qRJNG/enCVLlnDbbbcxb948HnnkEb744gvq16/PwYMHCQsL48EHH2TdunU8++yzJc5WUraHUo5cgYEEDxtPhB5j45t3OR3HGOOwjIwMrrvuOiZPnozLy8PgBw8eZOnSpVx++eUkJyczZswYduzYAUCPHj24/vrrmTRpEgUFBf6MXizbQylnTdt1ZWmja+i243XWLfmQ9j0udTqSMdWOt3sShXsmkwdO9nmGw4cPc8kll/D444/TrVs3r7dTVerWrVvsOZVXXnmFZcuWMWfOHDp06MCaNWt8GfmsbA/FAcnXPsl2qU/N+X8lO+uY03GMMeXs+PHjDBs2jOuvv54rr7yyRNtGR0cTGxtb9AjfgoICVq9eDcDmzZvp1q0bjz32GNHR0Wzfvp3IyEiOHDni8z4UxwqKA0JrRHDggn8RpztYNfUfTscxxpSzGTNmsHjxYv73v/8VXQ5ckqu4pk2bxssvv0yHDh1o164dc+bMAeCuu+4iMTGRxMRE+vXrR/v27bnwwgtZvXo1HTt29PtJeRu+3kFpz1xB0qHPyRj5GfFtOjkdx5gqrTTD1/vzkFdFZcPXV1LNrnmWTAkj8/0/U5Cf73QcY8wpJg+cXK2KSVlZQXFQ7fqN2dThXtrkrmf5zOecjmOMMWXiSEERkdoi8pmIbPK8R5+mXRMRmSciG0TkOxFJ8CzvKyIrRWSViHwlIi3KM78vpQy5jfXBSbRZN469GducjmOMMaXm1B7KfcACVW0JLPDMF+d1YJyqtgG6ALs9y/8LXKOqycBbwN/9nNdvxOUi6orxhOpxtrx1u9NxjDGm1JwqKEOAKZ7pKcDQUxuISFsgUFU/A1DVo6qa6VmtQJRnuiaww79x/SuuVTIrEm4m5chCVn/+jtNxjDGmVJwqKPVVNQPA816vmDatgIMi8r6IfCsi40QkwLPuZuBjEUkHrgPGlktqP+p09SNsdcVRb/HfyDx6yOk4xhhg63XXs/W6652OUWn4raCIyHwRWVfMa4iXHxEI9ATuAToDzYAbPevuAgapamNgMvDMGXKMFpE0EUkryeBr5S04JJTMAU8Tyx7WvFHy8YCMMRVfeQ9fP3PmTMaNG+ez/Gfjt6FXVLXf6daJyC4RiVXVDBGJ5ddzIydKB75V1c2ebT4AuonIbKCDqi7ztJsOnHawf1WdCEwE930opetN+WjTdQCpyy4lZed0flx9HS069HA6kjHGD3w5fH1eXh6BgcX/Kh82bJjvw5+BU4e8ZgM3eKZvAGYV02Y5EC0iMZ75C4HvgANATRFp5VneH9jgx6zl6pxr/8NBiUJn30Febq7TcYwxflDW4evPP/98HnjgAXr16sULL7zArFmz6Nq1Kx07duSiiy5i9273/9EnTZrEnXfeCcC1117LHXfcwXnnnUezZs2Khm7xJacGhxwLzBCRm4BtwJUAIpIC3KqqN6tqvojcAywQEQFWAK+oap6I/AF4T0QKcBeY3zvTDd+rWTuGFV3+QafU/2PpO0/R7epKewGbMRXWzieeIGfD2Yevz/7e3cab8yghbVrT4P77S5ylNMPXg3twycWLFwNw4MABBg8ejIjw8ssv8/TTT/PUU0/9Zpvdu3ezZMkS1q5dy/Dhw32+B+NIQVHVfUDfYpan4T7hXjj/GZBUTLuZgO/LawVx7sDfs2bNNJJ+eJ6d20bQoElLpyMZY/ygcPj6KVOmeD18faGRI0cWTW/bto3hw4ezc+dOcnJyaNWqVbHbDB06FBEhKSmJ7du3lyl7cWz4+gpIXC7qjnwRJvdk59t/pv5fPrZHBhvjQ97uSRTumcS/8brPM5R2+PpC4eHhRdNjxozh/vvvZ9CgQcyfP5+xY4u/8DUkJKRo2h/jONpvqQqqYcI5rGn5J5KzvuHbeb7/y2yMcU5Zhq8vzqFDh2jUqBGqypQpU86+gZ9YQanAUkbcz08BzYhb+jCHD+5zOo4xxkfKOnz9qR5++GGGDRtG7969qV+/vg+TlowNX1/Bbfp2Mc0+GMzymKF0u+1/TscxptIqzfD1/jzkVVGVZfh6O4dSwbXs2Iul31xJl13v8P3y+bTufNrbe4wxPladCokv2CGvSiDx2n+xR2oTMvdujufkOB3HGGOKZQWlEgiPiiajx+M0LdjKimmPOB3HmEqrOh3iL42y/nysoFQSyf2vZmVELzpunkj6T+tL/TkjJnzDiAnf+DCZMZVDaGgo+/bts6JyGqrKvn37CA0NLfVn2DmUSiTu6vHkTujGgRljaHTv53ZvijEl0LhxY9LT00s0xEl1ExoaSuPGjUu9vRWUSiSmYQLL2t1F1++eYPmHL9N5yJ+cjmRMpREUFETTpk2djlGl2X9xK5nOl9/DD4GtafHtExzYk+F0HGOMKWIFpZJxBQQQPGw8EZrJpjfvcjqOMcYUsYJSCTVt14UVja+ly6G5rPvqQ6fjGGMMYAWl0kq+5gm2SwNqLvgr2VnHnI5jjDFWUCqr0BoRHLjwX8TpDr59056ZYoxxnhWUSqx9zyGkRfWnU/oUtmxY4XQcY0w1ZwWlkmt27XNkShhZ799GQX6+03GMMdWYFZRKrna9RmxKvo82ud+x/P1nnY5jjKnGrKBUASmDx7A+uANt1v+bvTu2Oh3HGFNNWUGpAsTlIurKFwjRXLa+dbvTcYwx1ZQjBUVEaovIZyKyyfMeXUybC0Rk1QmvbBEZ6lnXVESWebafLiLB5d+LiiWuZRIrE26i09EvWP35dKfjGGOqIaf2UO4DFqhqS2CBZ/4kqrpQVZNVNRm4EMgE5nlWPwX8x7P9AeCm8oldsXW6+hG2uOKot/gBjh055HQcY0w141RBGQJM8UxPAYaepf0VwFxVzRQRwV1g3i3B9tVCcEgo2QOeJpY9rHnzXqfjGGOqGacKSn1VzQDwvNc7S/uRwNue6TrAQVXN88ynA438krISat11AKm1B9Nl5zQ2rfrK6TjGmGrEbwVFROaLyLpiXkNK+DmxQCLwaeGiYpqd9ok5IjJaRNJEJK26PAfhnOue4aDUhA/vIC/3uNNxjDHVhN8Kiqr2U9X2xbxmAbs8haKwYOw+w0cNB2aqaq5nfi9QS0QKn+XSGNhxhhwTVTVFVVNiYmLK3rFKoGZ0DFu7PETL/B9ZPuMpp+MYY6oJpw55zQZu8EzfAMw6Q9ur+PVwF+p+fudC3OdVvNm+Wuo48EZWh3Whw8bxZGzd6HQcY0w14FRBGQv0F5FNQH/PPCKSIiKTChuJSAIQByw6Zft7gbtF5Efc51ReLYfMlYq4XNQb+QIAu6b9GS0oAODBfX/hwX1/cTKaMaaKcqSgqOo+Ve2rqi097/s9y9NU9eYT2m1R1UaqWnDK9ptVtYuqtlDVK1U1p7z7UBnExp/D2pZ/IjlrKSs/nXL2DYwxpgzsTvkqrtOI+/kxoDlNlj3CoYP7nI5jjKnCrKBUcYFBwXDpc9TWg3z/xt1OxzHGVGFWUKqBFsk9WV5/OJ33zmJnbg2n4xhjqigrKNVE4nX/YrfUoWn+NvIKzt7eGGNKygpKNREeWYtd5z9OM1cGu3PDnI5jjKmCSlxQRMQlIlH+CGP8q0O/q0grOIfurGH3zl+cjmOMqWK8Kigi8paIRIlIOPAd8IOI2M0MldDxoAhCyOXH6Q84HcUYU8V4u4fSVlUP4x7V92OgCXCd31IZv6kZcJyltKPr/tl8vybV6TjGmCrE24ISJCJBuAvKLM+4WqcdkNFUbOFBwjGpwbE5f8M9ko0xxpSdtwVlArAFCAcWi0g8cNhfoYx/hbgK2Nz2T3Q6nsY382Y4HccYU0V4VVBU9XnPECiD1G0rcIGfsxk/Shp6DxmuBtRf+hiZ2dlOxzHGVAHenpS/w3NSXkTkVRFZifupiaaSebTOOB6tMw5XcCjHej1Ic/2FJTOedTqWMaYK8PaQ1+89J+UvAmKAUXhGCDaVV4veV/NTWCIdf3qJ7bvO9EgaY4w5O28LSuFTEgcBk1V1NcU/OdFUJiJEDfkXdeUQa6c/7HQaY0wl521BWSEi83AXlE9FJBKwATyqgJjW57EhZiB99s1g1dq1TscxxlRi3haUm4D7gM6qmgkE4z7sZaqApsP/hYhw4MO/k19glxEbY0rH26u8CnA/u/3vIvJv4DxVXePXZKbchMbEs/WcUVxw/As+X/Cx03GMMZWUt1d5jQXuwD3synfA7SLypD+DmfLVctjfOeCKJmbJoxzJOu50HGNMJeTtIa9BQH9VfU1VXwMGApf4L5YpbxIaxbHz7iWZ7/nsvVecjmOMqYRKMtpwrROma/o6iHFe4wtHkxHSjJRNz/Lzrv1OxzHGVDLeFpQngW9F5H8iMgVYATxR2i8Vkdoi8pmIbPK8RxfT5gIRWXXCK1tEhnrWTRWRH0RknYi85hlnzJSVK4Cw3z1JE9nN8ul2m5ExpmS8PSn/NtANeN/z6q6q08rwvfcBC1S1JbDAM3/qdy5U1WRVTcZ9V34mMM+zeirQGkgEwoCby5DFnKBW4kC21u7BwH1v8M3aH5yOY4ypRM5YUETk3MIXEAukA78ADT3LSmsIMMUzPQX3KMZncgUw13PJMqr6sWdMMQVScV+BZnwk9spx1JBsdn74KHn5druRMcY7gWdZ//QZ1imlH8+rvqpmAKhqhojUO0v7kcAzpy70HOq6DvcVaMUSkdHAaIAmTZqUKuyoT9y33EweOLlU21c2wbHt2NZsOJf+NIMPP1/EsP42Dqgx5uzOWFBUtdS/SURkPtCgmFUlelSgiMTiPrT1aTGrXwIWq+qXp9teVScCEwFSUlLsrj0vxV32GNlPzyZ6yWMcOK8H0eHBTkcyxlRwZ9tDAUBELitm8SFgraoWO6qgqvY7w+ftEpFYz95JLHCmkQmHAzM9D/U68TMewj1Q5S1n7YApMYmox5Eud9Bn2ZP8b+bb3HjtDU5HMsZUcCUZemUScI3n9QpwN7BERErzKODZQOFvqBuAWWdoexXw9okLRORmYABwlecufuMH9frdyYGgBnTe+DQbMw46HccYU8F5W1AKgDaqermqXg60BXKArsC9pfjesUB/EdkE9PfMIyIpIjKpsJGIJABxwKJTtn8ZqA9847mk+MFSZDBnExRK0IBHaefayhcznrfHBRtjzsirQ15AgqruOmF+N9BKVfeLSO7pNjodVd0H9C1meRonXAKsqluARsW08za3KaOITsPZ/eULDNn/KgvXXseFSU2djmSMqaC83UP5UkTmiMgNInID7kNWi0UkHLBjIVWZCLUvG0d9Oci2D58kJy/f6UTGmArK24IyBpgMJAMdcd87MkZVj5XlSjBTOQTGd2N3k0GMOD6TdxamOh3HGFNBeXXoSFVVRL4CjuO+/yRV7YB6pTT9lu6l2q7esCfJfe4zwr8ay55uM4iJDPFxMmNMZeft8PXDcd+RfgXuy3iXicgV/gxmKpjoBI51/ANDWMTbs2Y7ncYYUwF5e8jrAdxPa7xBVa8HugD/8F8sUxHVGnAfWUE16bzxGdal26kzY8zJvC0orlNuYNxXgm1NVRFaE9cF99Pd9R0fv/uaXUZsjDmJt0XhExH5VERuFJEbgY8Ae1ZsNRTW7SYOhTfjiv0T+Hj1VqfjGGMqEG+Hr/8L7vGwkoAOwERVLc0NjaayCwgk4tInaebaycY5z5Oda5cRG2PcvD5sparvqerdqnqXqs70ZyhTsQWcM4CDsT24MXc6UxascjqOMaaCONvzUI6IyOFiXkdE5HB5hTQVjAi1hvyLmnKM4K+fJuNQltOJjDEVwBkLiqpGqmpUMa9IVY0qr5CmAmrQnsy2V3GNfMKrs+Y7ncYYUwHYlVqm1CIufggCgum06TlWbD3gdBxjjMOsoJjSi2wA59/JxQHLeff96RQU2GXExlRnVlBMmQSffzuZofUZeWACM1f+4nQcY4yDrKCYsgmuQejAR+jg2szqua9wLCfP6UTGGIdYQTFl5koawbE6idya9yYTF6xzOo4xxiFWUEzZuVyEX/oUDWU/+s1L/LI/0+lExhgHWEExvpHQg+wWg7jF9QEvzF7idBpjjAOsoBifCb34cUJd+ST/+CLf/LTP6TjGmHJmBcX4Tp3maOc/MDxwEa9/MId8u4zYmGrFkYIiIrVF5DMR2eR5jy6mzQUisuqEV7aIDD2lzXgROVp+yc3ZBPb5K/lBkVx9cCLTUm00YmOqE6f2UO4DFqhqS2CBZ/4kqrpQVZNVNRm4EMgE5hWuF5EUoFY55TXeqlGboAvvo2fAOpbOm86hrFynExljyolTBWUIMMUzPQUYeoa24H708FxVzQQQkQBgHPBXvyU0pSadbyYnqim3501h/PwNTscxxpQTpwpKfVXNAPC81ztL+5HA2yfM3wbMLvyMMxGR0SKSJiJpe/bsKXVgUwKBwYRc/DgtXds5vmwyP+2xo5LGVAd+KygiMl9E1hXzGlLCz4kFEoFPPfMNgSuB8d5sr6oTVTVFVVNiYmJK2g1TWq0v4Xjj87gz4B2enr3c6TTGmHLgt4Kiqv1UtX0xr1nALk+hKCwYu8/wUcOBmapaeDC+I9AC+FFEtgA1RORHf/Wjqhn1yShGfTLK/18kQvCgJ4mWoyT+/CoLfzjTH7Expipw6pDXbOAGz/QNwKwztL2KEw53qepHqtpAVRNUNQHIVNUWfksKjBy/npHj1/vzK6qmhskUJI7gpsC5TJq9kNz8AqcTGWP8yKmCMhboLyKbgP6eeUQkRUQmFTYSkQQgDljkQEbjAwH9HiQgIJCRh1/jjW/sMuLijJjwDSMmfON0DJ/oOvlyuk6+3OkYPlFV+lKe/XCkoKjqPlXtq6otPe/7PcvTVPXmE9ptUdVGqnra/9qqakR5ZDalVLMRrh63c2nAUj6fP4f9x447ncgY4yd2p7zxO+lxB3k16nF3wRSemfe903GMMX5iBcX4X0gEgf0e5FzXJg6lzWBDxmGnE1UoW4L/zZbgfzsdw5gys4Jiykfy1eTXa8ffgqbx5OxVqNo4X8ZUNVZQvBCSmUdwlj2JsExcAQQMfIKG7KHNtrf4dP0upxMZY3zMCooXah44ToMdWWy7+Q9krV7tdJzKq1kfCloO4PagWbz00Tdk5+Y7ncgY40NWULywJzaMA3VCyF6/ni0jRvLLLbeStc7uSykN10WPU0NyuPLIm7y25Gen4xhjfMgKihfUJRypFUyL+Z8Rc/fdZK1axZYrruCXMbeRvcEGPyyRmFZI55u4OvBzPvn8C3YfznY6kTHGR6ygeGFvRAGZwYorPJy6o/9A8wXzibnjdjKXL+fnYZeRfvsdZG/c6HTMyqP3fUhwBHfzBv/69Aen0xhjfMQKihc+SM7loSHZDP9wOE+nPc3XB7+lxs030GL+Z9QdM4ZjX3/Nz0OGsv3uu8n56Sen41Z84XVw9f4LfVyr2PntXFb/ctDpRMYYH7CC4oX+3wVx0fpAwoPCmbphKn9a8Cd6vN2DG78aw/Tz4fBb/6LWH24DTxe9AAAb4klEQVTi6BeL2Py7S9n+l7+S87OdHzijrrdQUDOeh4Kn8viHa+0yYmOqgECnA1QG8ftdxO93MWDcZLLysli1exWpO1NJzUjllbWvMEELCKkXQve/t+fSZUrjT+dx+KOPqDl4MHX/9EeCmzRxugsVT2AIroseoeU7N9Js+yxmr27GkORGXm9eOPbV9Fu6+yuhMaaErKCUUFhgGN0bdqd7Q/cvsiPHj7Bi1wqWZSwjdWcq/9d2I1HxyhWpgfT7aDYHZ89CLulLszv+SkjjOIfTVzBth6KNu3Lf9ne44uM+9G9bnxrB9lfSmMrK/vV6Ydqf2wEwoJh1kcGR9InrQ5+4PgDsz97P8p3LSe2YyhMbl9Dps230/3g+mz6az8YeccgNV9Ax8SLio+IRkfLrREUkggx8guhJfRma+Q4TFrXirv6tvNr016FK3vNfPmNMiVhB8bHaobUZkDCAAQkDoDvsvGInK9Z9Ru7/ptFi8Wb4+j/M7PAsX/atR+tW59E1titdY7vSILyB09Gd0TgF2l/BLetn039RP4Z3jqNRrTCnUxljSsEKip81CG/AJV2vg67XcXz7dra+8AwDZn9CvzV7WNTpE8Z1mc2hCKFJZBO6xHaha4OudG7QmTphdZyOXn76PUTQhg+52zWNsXPbM/6qjk4nMsaUghWUchTcqBEtn3ya42PuZu/L/6XvzA/ouyqAnQM6Mve8ED75+RPe3fguAC1qtaBbbDe6NOhCpwadiAqOcji9H9VqgnQfw5CvnuHVNV+yvHs8nRNqO53KGFNCVlAcENy4EQ0ff5y6o0ez96X/wuzZ/P6zEO6+5ir2DDmPZdkbSM1I5d2N7/LmhjdxiYu2tdu692Biu9KxXkfCAqvYYaHz70JXvsEj8jb/mJ3M7Nt64nJV83NMxlQyVlAcFNykCQ3HPkmdW9yF5cCrkwl+axqDr7+OUTf+i/zIGqzes7roEuXX17/Oa+teI9AVSIeYDnRt0JUusV1IqptEUECQ090pm9Ao5ML76TjnLhrtXMC7K5oyvLNdFWdMZWIFpQIIadqURuP+Rd1bRrP3pZfY9/IEDrw5ldo33MC5N1xP5+TOjEkeQ2ZuJt/u/pZlO5exLGMZ/139X15a/RJhgWGcW+/conMwrWu3JsAV4HS3Sq7j9eiyiTy8fzrDPunGxYkNiAyt5IXSmGrEkYIiIrWB6UACsAUYrqoHTmlzAfCfExa1Bkaq6gfivt72ceBKIB/4r6o+Xw7R/SqkRQsaPfMMdW65lb0vvsjeF19k/xtvUGfUjURfdx01IiLo0agHPRr1AOBQziHSdqWRmpFK6s5U/rPC/eOKDIokpUGK+wqyBl1pXqt55bhEOSAQuehxYqdeziW5c3hhYQJ/u7iN06mMMV5yag/lPmCBqo4Vkfs88/ee2EBVFwLJUFSAfgTmeVbfCMQBrVW1QETqlVfw8hB6TisaP/8c2Rs2sOeFF9nz3PPs/98Uat90E7WvuRpXeDgANUNq0rdJX/o26QvA3qy9RcVlWcYyFv6yEHBfylx4eCw7L5uQgBDH+nZWLftB8778388f0Oer3lzVuQkJdcOdTmWM8YJTBWUI0MczPQX4glMKyimuAOaqaqZn/o/A1apaAKCqu/0T01mhbdoQ9+ILZK1bz97x49nzzDPsnzyZOjffTPTVV+EKO/nEfN2wugxqNohBzQYBsP3odlIzUlm2cxmpGanM3TIXgJCAEJ5KfYpejXuRUj+l4p1/uehxwl7uwZ8D3+efHzfjletTnE5kjPGCU4ND1lfVDADP+9n2MEYCb58w3xwYISJpIjJXRFr6KWeFENa+HXETXiZh+jRC27Vj97hx/Nj/IvZPmUJB9umfJ9IoohHDWg5jbM+xLLhyAbOGzqJJZBNCA0KZ8cMMRn82mp7Te3LXwruYuWkme7P2lmOvzqB+W+TcG7jaNY8fN6ziq00VJJcx5oz8tociIvOB4m7/fqCEnxMLJAKfnrA4BMhW1RQRuQx4Deh5mu1HA6MBmlTyQRrDOnSgyaRXyFy5kj3jx7PrybHsm/QqdW65hVpXXoEr5PSHskSEZjWbUa9GPerVqMdL/V4iNSOVRemLWJS+iPnb5gPQvk57esX1olfjXrSp3QaXOPR/jgvux7X2HR51TefROS35+PaeBAbY4NjGVGR+Kyiq2u9060Rkl4jEqmqGp2Cc6ZDVcGCmquaesCydXwdxmglMPkOOicBEgJSUlCoxRnqNc88lfvJkjqWmsvf58ex6/HH2TZpE3VtvodZllyHBwWf9jLDAMHrH9aZ3XG9UlY0HNhYVl/+u+i8vrXqJmLAYejXuRc/GPeke250aQTXKoXceEfWQnnfTc8Gj1NmzjLdT47mue0L5fb8xpsScOocyG7gBGOt5n3WGtlcBfztl2QfAhbj3THoD1fJxieFdulDjjdfJXLaMPc89z86HH2HvxInU/eMfqTV0KBLk3bkREeGc2udwTu1zGJ00mv3Z+/lq+1csTl/Mp1s+5b1N7xHkCqJLgy70bNyTXo17ERdZDveIdPsTmvYaT2RO57J5SVzaoSG1apy9WBpjnOFUQRkLzBCRm4BtuC//RURSgFtV9WbPfALuq7kWFbP9VBG5CzgK3Fw+sSseESG8WzdqdO3KsSVfs2f88+z8x4PsmzCRun/6EzUHX4oEluyPuXZobQY3H8zg5oPJLcjl213fsjh9MYvSFzE2dSxjU8fSrGYzejfuTa/GvUiul0ygyw9/lYLCkL4P0/T9m+mbu5Bn58fx8OB2vv8eh2Tn5rN1XybZR+IpyKvB699scTpSsVSVPD1OnuaQV3CcPD1OruaQV5DjeXevy9XjZGaGAsqdc190OnaZZWa6DyFX9r4U9uOXg/uIq+XfMQKlOj0pLyUlRdPS0kq83ahPRgEweeBpj6xVGKrKscWL2fP8eLLXrycovgkxY8YQdcklSEAAn17SBYABH6WW6vO3Hd5WVFzSdqWRV5BHZHAk5zc8n15xvTi/4fnUCq3luw4VFMCr/Ti8ayvnZY5j5h39aVk/kq6TLwdg2aiKPXx9Xn4B6Qey+Hnvsd+8dhzKovT//ApA8sCVi0iuf99duWePYyq88T3fpk+z9qXaVkRWqOpZL7e0O+WrGBEhondvwnv14ujChex5fjw7/nove//7MnVvGwOqUIabHJtENeHattdybdtrOXr8KEszlrIofRGL0xczd8tcXOKiQ0wHejV2n9hvWatl2W6qdLlgwBNEvTaAPwZ/zKNzGvH677uU/vP8QFXZdTiHzXuPuovFnmNs2XeMzXuPsW1fJnkFv1aNyNBAmsVEkJIQRe2aLsLC9zP1h9eQgGMMatGLnPxscvJzPK/sk96z87M5np9Ddl42xwtySpXVJQGEBIQQGhBKsOc9JCCEkIBIz7t7PjQwlGCXez408NS2p74XTofy+w//BgjTL3vORz9d54x4/w6ASt+Xwn50i/PuWUNlYQWlihIRIi+8kIg+fTgyfz57x7/Ajv+7hwZBLjIjAzm2dCmh7dsTEBFR6u+ICI6gX3w/+sX3o0AL+G7fd+4T+78s4rmVz/HcyueIDY8tKi5dGnQhNDC05F/UpBu0HcLo7z9kyqY+fP59Qqkzl8XBzONs9hSMwr2MzXuPsWXvMbJy84vahQS6aFo3nFb1wunZOoAa4QeQoD1ksYtdWelsPbyVRUe3k7/bs00woMLXGYsIDQx1/+IOdP8CrxUaSUhA3aLlJ74X/uIvbB8WEFa03UnLA8OK2ga5/HvPUUCgu0/N61T+5/sEBOYBlb8vhf0IDfL/+UcrKFWcuFxEXXQRkf36ceTTT/n53nuotf84224cBSIEN2tGWFISYUmJhCYmEXpOK69P5p/IJS7a121P+7rtGZM8ht2Zu/ky/UsWpy9m9k+zmf7DdEIDQukW263oxH6JHirW72ECf5jLIxHv8/hHjdHaLkQKSpzzbDKP5/Hz3mNs2ZvJz3uPuguI53Uw89dDPwEuIS46jIS6NTg3IYiIyAMEhuwlW3axLyedbUe2kXZ4Gzl7c8BzG01YYBjxUfG0qdOGgU0HkhCVQHxUPDfPeRAhgC9GVOzDd8acjRWUakJcLqIuvpidLzyEK1/p/vdnyVqzmuw1azm6aBGHZs50twsJIbRNG0KTEglL6kBYUiJBcXElPmxVr0Y9Lm91OZe3upyc/BzSdqYVnXv5Iv0LAM6JPodejXvRO6437eu0P/OAlrWbIV1vYeDXLzB+X1/2SFvCa68r1c/ieF4BvxzI/HVPY9+vex07D598o2hszVCa1g2nf/ua1Io6RHDofnJduziYu4Nfjmxj45GtrDh4BA662we6AomLjCM+Mp7zYs8jvmZ8UeGICYsp9ucoVMKBPI0phhWUaqggQIg4vwcR57sHmVRVcrfvIHvtGrJWryFr7VoOzniHA6+/AUBArVruApOYRFiHJEITEwmMjvb6+0ICQooGtbyvy31sPrS5qLi8tu41Xln7CtEh0UV7Luc1PI/I4MjfflDPe5Bvp/Lv0Blcsu8OwqJ+PH0fC5SMw9meQvHrnsaWvcf45UAW+Sec14iuEUTTuuF0b16T2tEuQkL3URC4h6MFGaQf3cbWw1tZe2QvHHG3F4TY8Fjio+K5pOklxEfFEx/lLhyxEbH+ueLNmErA/uZXM9P+7L7sdsAJy0SE4MaNCG7ciKiLLwZA8/LI2bSJrDVryVq7huzVa9j75VcUXpYUFBd38qGytm1whZ79/IiI0LxWc5rXas6o9qM4lHOIr3d8XXRT5eyfZhMogZxb/9yicy8JUQnu/9mH1YI+f6Pt3L/QlzWs3t2SvUdz2OI5l/HzCec3tuw7Rk7er4fEwoICaFo3nLYNI+nTzn1eQ4P2kFmwk11Z6Ww5vIXPj2VQkPHrNrVDa5MQlUDPRj2LikZ8VDxxkXGlOxdkTBVnBcUUSwID3Ye+2rQhesRwAPKPHiP7u/Vkr1lD1pq1ZK5YweGPPnJvEBhIaKtWJx0qC27WDHGdebiUmiE1ubjpxVzc9GLyC/JZs3cNi35ZxOLti/l32r/5d9q/aRLZpKi4pHS8lqDUiTy+8zXOPzKelMfnF31WUIDQpHYNEurWoHOLQCIiDuIK3kOO7GJPdjrbDm9j6ZFt5O7JhT3ubcKDwomPiicpJonBzQcX7Wk0iWpS/F6SMea0rKAYrwVEhBPepQvhXX69bDd3126y1631HCpbw+E5H3Fw2nQAXOHhhCYmEpaY6DlUlkRQ/dOPAxrgCqBjvY50rNeROzvdyY6jO1icvpjF6YuZ8cMM3tzwJuFB4XRPaEmvnB3cs+N59g+6l8CwveTJbvYf3862I1tZd3grqfszYb/7c4NdwTSJakJ8VDy94noVndOIj4qnTmidyvGsGGMqASsopkyC6tcjqH5fIvu6n8miBQUc//lnstasLTons2/yZMhzX7oYWL8+YUlJRedk3JcuF/+8k4YRDRnZeiQjW48kMzeT1J2pRede5sfUgZjdsP3/AHAhNKxRj/iazejYomPRnkZ8zXga1GhQOZ9gaUwlYwXF+JS4XIQ0b05I8+YwbCgABTk5ZH/3Hdlr17rPyaxZw5HPPvNsIIS0aE5oYlLROZmQli1/c+lyjaAa9InrQ5+4Pqgqb11/DgXtsmjkyiUhN5fGuXkEsxVYDqG1oGZjiGroeXmmazaCqEbu6WB7aJcxvmYFxfidKySEGh07UqNjx6JleQcOkL1uXdGhsqOff86h998HQEJDCW3b9tdDZUlJBDVqVHRoSkSIzgiEjEgunLsCDu/wvLZ7XjvgkGd6+wrI3PfbUKG1fi0uRYXGMx/VyL2snIrOQ1M3uCdGlcvX+VVV6ospOSsoxhGB0dFE9OxJRE/3Y2xUldz0dLLWrCk66X9g2jT2T5kCQEDt2oQlJnpO+ifhKlAKXAJBYVCnuft1OrnZcKSwyJxSeA5vhx3fQmYxD/EKrXlyoSluryek9CMNmIqtqhTH8uyHFRRTIYgIwXFxBMfFUfOSSwDQ3FyyN2484VDZao4uXgyqxAO5AcrmSwdDUCASGIQEBiIBAUhQIAR6lp12vg4S2AAJ6IyEBkIYSH4WkncUyTsKx48gRw8j+w8hx7chOavh+GHEpYiAuBQEJDQciYxBomIgsj5SswFSMxap1RBqNUJqNULCayEBARDkyXiWK9+MqaysoJgKS4KCCGvXjrB27YgeORKA/KNHyV63nrQ7/kBIbgHR8U0gLx/Ny/O8ctHMrJPmT1qfnwe5eSfM50OuN6PpBgK1T7PuqOf1s5cdEyTABYEBSGAQTTILUIRNvftAgAsRF7hc7sLjcp20rNj1J0xLgAvOsB6XIK6A0y47eb2AK+A068Wz/cnTUUfchXb/1KnFrj/5M09dX1zmwm3O0Gcvl3m13q74KxMrKKZSCYiIILxbV/ZHuU/ad3vhhTJ/pqpCfmHRyYe83KJio7l5p58vKlS5UDh/PAs9sheO7kOP7kOP7UePHYDMQ2jhKycTFLRA0AJQFQryQVzbwHMDvxac8J4v7vbKr+sV0JOXq3pWq5y07Izb8NtlRdPIb5d5lp9O4dM2dj32eJn/XJzh2fMUaAYg8H271k6HKpNmnveclQsJOfcCv36XFRRT7YmI55BYOf1zyDsORzKKzuN8/++7CAoqoPmIG8vn+8tICyuXKlrwayXTAuXn918HFRKGXONerwqeNlrAb5cpUOBZpgoFnDBd2LaYZads585RfKbTLTtxu5Nzupcd+G41ALVaJzr3w/aBg9+vBSCgbiO/f5cVFGPKW2AwRMe7X8Dm7Q8C0Lz/o06m8pqcZhpg4/Pup3m3uOypcsvjL2n92gIw6MUzPaG84lvh6cc5Tfz/PBQ7O2iMMcYnbA/FGIf9b7j7wUeDHM7hC1WpL6bkrKAY47CtQWe4h6aSqUp9eeSaNkDlL47l2Q9HCoqI1AamAwnAFmC4qh44pc0FwH9OWNQaGKmqH4hIX2Ac7kN2R4EbVfX0D8cwRSYPnOx0BJ8Ye3UCAMOcjWGMOYFT51DuAxaoaktggWf+JKq6UFWTVTUZuBDIBOZ5Vv8XuMaz7i3g7+UT2xhjzOk4VVCGAFM801OAoWdpfwUwV1UzPfMKRHmmawI7fJ7QGGNMiTh1DqW+qmYAqGqGiJz+IRluI4FnTpi/GfhYRLKAw0A3/8Q0xhjjLb8VFBGZDzQoZtUDJfycWCAR+PSExXcBg1R1mYj8BXexufk0248GRgM0adKkJF9dpKqcdzDGGH/yW0FR1X6nWyciu0Qk1rN3EgvsPsNHDQdmqmquZ9sYoIOqLvOsnw58coYcE4GJACkpKVrCbhhjjPGSU+dQZgM3eKZvAM50K+pVwNsnzB8AaopI4W2f/YENPk9ojDGmRJw6hzIWmCEiNwHbgCsBRCQFuFVVb/bMJwBxwKLCDVU1T0T+ALwnIgW4C8zvyzW9McaY33CkoKjqPqBvMcvTOOFciKpuAX4zopmqzgRm+jGiMcaYErI75Y1xWNvYqLM3qiSWjXrP6Qg+U1X6Up79sIJijMPsKkJTVdhow8YYY3zC9lBMpVSVDhMZU1VYQTGVkh0mMqbisUNexhhjfMIKijHGGJ+wgmKMMcYnrKAYY4zxCSsoxhhjfMIKijHGGJ+wgmKMMcYnrKAYY4zxCSsoxhhjfEJUq89DDEVkD7C1lJvXBfb6MI6Tqkpfqko/wPpSUVWVvpS1H/GqGnO2RtWqoJSFiKSpaorTOXyhqvSlqvQDrC8VVVXpS3n1ww55GWOM8QkrKMYYY3zCCor3JjodwIeqSl+qSj/A+lJRVZW+lEs/7ByKMcYYn7A9FGOMMT5hBaUEROQxEVkjIqtEZJ6INHQ6U2mJyDgR+d7Tn5kiUsvpTKUhIleKyHoRKRCRSnk1jogMFJEfRORHEbnP6TylJSKvichuEVnndJayEJE4EVkoIhs8f7fucDpTaYlIqIikishqT18e8ev32SEv74lIlKoe9kzfDrRV1VsdjlUqInIR8Lmq5onIUwCqeq/DsUpMRNoABcAE4B5VTXM4UomISACwEegPpAPLgatU9TtHg5WCiPQCjgKvq2p7p/OUlojEArGqulJEIoEVwNBK+mciQLiqHhWRIOAr4A5VXeqP77M9lBIoLCYe4UClrcaqOk9V8zyzS4HGTuYpLVXdoKo/OJ2jDLoAP6rqZlU9DkwDhjicqVRUdTGw3+kcZaWqGaq60jN9BNgANHI2Vemo21HPbJDn5bffW1ZQSkhE/ikivwDXAA86ncdHfg/MdTpENdUI+OWE+XQq6S+vqkhEEoCOwDJnk5SeiASIyCpgN/CZqvqtL1ZQTiEi80VkXTGvIQCq+oCqxgFTgducTXtmZ+uLp80DQB7u/lRI3vSjEpNillXaPd+qREQigPeAO085OlGpqGq+qibjPgrRRUT8djgy0F8fXFmpaj8vm74FfAQ85Mc4ZXK2vojIDcDvgL5agU+mleDPpDJKB+JOmG8M7HAoi/HwnG94D5iqqu87nccXVPWgiHwBDAT8cuGE7aGUgIi0PGF2MPC9U1nKSkQGAvcCg1U10+k81dhyoKWINBWRYGAkMNvhTNWa50T2q8AGVX3G6TxlISIxhVdwikgY0A8//t6yq7xKQETeA87BfVXRVuBWVd3ubKrSEZEfgRBgn2fR0sp4xZqIDAPGAzHAQWCVqg5wNlXJiMgg4FkgAHhNVf/pcKRSEZG3gT64R7bdBTykqq86GqoUROR84EtgLe5/6wD3q+rHzqUqHRFJAqbg/rvlAmao6qN++z4rKMYYY3zBDnkZY4zxCSsoxhhjfMIKijHGGJ+wgmKMMcYnrKAYY4zxCSsoxviQiBw9e6szbv+uiDTzTEeIyAQR+ckzUuxiEekqIsGeabsx2VQoVlCMqSBEpB0QoKqbPYsm4R5ssaWqtgNuBOp6BpFcAIxwJKgxp2EFxRg/ELdxnjHH1orICM9yl4i85NnjmCMiH4vIFZ7NrgFmedo1B7oCf1fVAgDPiMQfedp+4GlvTIVhu8zG+MdlQDLQAfed48tFZDHQA0gAEoF6uIdGf82zTQ/gbc90O9x3/eef5vPXAZ39ktyYUrI9FGP843zgbc9Ir7uARbgLwPnAO6paoKo7gYUnbBML7PHmwz2F5rjnAVDGVAhWUIzxj+KGpT/TcoAsINQzvR7oICJn+jcaAmSXIpsxfmEFxRj/WAyM8DzcKAboBaTifgTr5Z5zKfVxD6ZYaAPQAkBVfwLSgEc8o98iIi0LnwEjInWAPaqaW14dMuZsrKAY4x8zgTXAauBz4K+eQ1zv4X4GyjpgAu4nAR7ybPMRJxeYm4EGwI8ishZ4hV+flXIBUOlGvzVVm402bEw5E5EIVT3q2ctIBXqo6k7P8yoWeuZPdzK+8DPeB/6mqj+UQ2RjvGJXeRlT/uZ4HnoUDDzm2XNBVbNE5CHcz5TfdrqNPQ/i+sCKialobA/FGGOMT9g5FGOMMT5hBcUYY4xPWEExxhjjE1ZQjDHG+IQVFGOMMT5hBcUYY4xP/D8KOHfQihfqvAAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x200e52bddd8>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "test_means = grid_acc_noMissing.cv_results_[ 'mean_test_score' ]\n",
    "test_stds = grid_acc_noMissing.cv_results_[ 'std_test_score' ]\n",
    "train_means = grid_acc_noMissing.cv_results_[ 'mean_train_score' ]\n",
    "train_stds = grid_acc_noMissing.cv_results_[ 'std_train_score' ]\n",
    "\n",
    "# plot results\n",
    "n_Cs = len(Cs)\n",
    "number_penaltys = len(penaltys)\n",
    "test_scores = np.array(test_means).reshape(n_Cs,number_penaltys)\n",
    "train_scores = np.array(train_means).reshape(n_Cs,number_penaltys)\n",
    "test_stds = np.array(test_stds).reshape(n_Cs,number_penaltys)\n",
    "train_stds = np.array(train_stds).reshape(n_Cs,number_penaltys)\n",
    "\n",
    "x_axis = np.log10(Cs)\n",
    "for i, value in enumerate(penaltys):\n",
    "    #pyplot.plot(log(Cs), test_scores[i], label= 'penalty:'   + str(value))\n",
    "    plt.errorbar(x_axis, -test_scores[:,i], yerr=test_stds[:,i] ,label = penaltys[i] +' Test')\n",
    "    plt.errorbar(x_axis, -train_scores[:,i], yerr=train_stds[:,i] ,label = penaltys[i] +' Train')\n",
    "    \n",
    "plt.legend()\n",
    "plt.xlabel( 'log(C)' )                                                                                                      \n",
    "plt.ylabel( 'logloss' )\n",
    "plt.savefig('LogisticGridSearchCV_C.png' )\n",
    "\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 总结：  \n",
    "1.分别用neg_log_loss和accuracy用默认参数训练lr;  \n",
    "2.GridSearchCV+neg_log_loss进行超参数调优；（C=1, penalty='l1'）  \n",
    "  GridSerachCV+neg_log_loss进行超参数调优； (C=0.01,penalty='l2')\n",
    "  LogisticRegressionCV(l1正则)+neg_log_loss进行超参数调优；  (C=1)      \n",
    "3.去掉serum_insulin_Missing：  \n",
    "用GridSerachCV+neg_log_loss进行参数调优  \n",
    "用GridSerachCV+accuracy进行参数调优  \n",
    "结果与之前一样"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.4"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
